#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CSV文件中文编码转换工具
用于将CSV文件转换为支持中文显示的格式

使用方法:
    python scripts/csv_converter.py
"""

import pandas as pd
import os
import sys
from typing import List, Optional

def convert_csv_to_chinese_compatible(input_file: str, 
                                     output_file: Optional[str] = None,
                                     encoding: str = 'utf-8-sig') -> str:
    """
    将CSV文件转换为支持中文显示的格式
    
    参数:
        input_file: 输入CSV文件路径
        output_file: 输出CSV文件路径（如果为None，则在原文件名后加_chinese）
        encoding: 输出编码格式，默认为utf-8-sig（支持Excel中文显示）
    
    返回:
        输出文件路径
    """
    if not os.path.exists(input_file):
        raise FileNotFoundError(f"输入文件不存在: {input_file}")
    
    # 生成输出文件名
    if output_file is None:
        base_name = os.path.splitext(input_file)[0]
        extension = os.path.splitext(input_file)[1]
        output_file = f"{base_name}_chinese{extension}"
    
    print(f"正在转换文件: {input_file} -> {output_file}")
    
    try:
        # 尝试不同的编码读取CSV文件
        encodings_to_try = ['utf-8', 'utf-8-sig', 'gbk', 'gb2312', 'cp936']
        df = None
        
        for enc in encodings_to_try:
            try:
                df = pd.read_csv(input_file, encoding=enc)
                print(f"成功使用编码 {enc} 读取文件")
                break
            except UnicodeDecodeError:
                continue
        
        if df is None:
            raise Exception("无法使用常见编码读取文件")
        
        # 显示文件基本信息
        print(f"文件包含 {len(df)} 行数据，{len(df.columns)} 列")
        print(f"列名: {list(df.columns)}")
        
        # 保存为支持中文的格式
        df.to_csv(output_file, index=False, encoding=encoding)
        
        print(f"✅ 转换完成: {output_file}")
        print(f"编码格式: {encoding}")
        
        return output_file
        
    except Exception as e:
        print(f"❌ 转换失败: {str(e)}")
        raise

def batch_convert_csv_files(file_list: List[str], 
                           output_dir: Optional[str] = None,
                           encoding: str = 'utf-8-sig') -> List[str]:
    """
    批量转换CSV文件
    
    参数:
        file_list: 要转换的文件列表
        output_dir: 输出目录（如果为None，则输出到原文件目录）
        encoding: 输出编码格式
    
    返回:
        转换后的文件路径列表
    """
    converted_files = []
    
    for input_file in file_list:
        try:
            if output_dir:
                os.makedirs(output_dir, exist_ok=True)
                filename = os.path.basename(input_file)
                base_name = os.path.splitext(filename)[0]
                extension = os.path.splitext(filename)[1]
                output_file = os.path.join(output_dir, f"{base_name}_chinese{extension}")
            else:
                output_file = None
            
            converted_file = convert_csv_to_chinese_compatible(
                input_file=input_file,
                output_file=output_file,
                encoding=encoding
            )
            converted_files.append(converted_file)
            
        except Exception as e:
            print(f"转换文件 {input_file} 时出错: {str(e)}")
            continue
    
    return converted_files

def show_csv_preview(file_path: str, rows: int = 5):
    """
    显示CSV文件预览
    
    参数:
        file_path: CSV文件路径
        rows: 显示的行数
    """
    try:
        # 尝试不同编码读取
        encodings_to_try = ['utf-8', 'utf-8-sig', 'gbk', 'gb2312', 'cp936']
        df = None
        
        for enc in encodings_to_try:
            try:
                df = pd.read_csv(file_path, encoding=enc)
                break
            except UnicodeDecodeError:
                continue
        
        if df is None:
            print(f"❌ 无法读取文件: {file_path}")
            return
        
        print(f"\n📄 文件预览: {file_path}")
        print(f"总行数: {len(df)} 行，总列数: {len(df.columns)} 列")
        print(f"列名: {list(df.columns)}")
        print("\n前 {} 行数据:".format(min(rows, len(df))))
        print("=" * 80)
        
        # 设置pandas显示选项
        pd.set_option('display.max_columns', None)
        pd.set_option('display.width', None)
        pd.set_option('display.max_colwidth', 50)
        
        print(df.head(rows).to_string())
        print("=" * 80)
        
    except Exception as e:
        print(f"❌ 预览文件出错: {str(e)}")

def main():
    """主函数"""
    print("🔄 CSV中文编码转换工具")
    print("=" * 50)
    
    # 定义要转换的文件列表
    files_to_convert = [
        "data/processed/evaluation_results.csv",
        "data/processed/reranking_results.csv"
    ]
    
    # 检查文件是否存在
    existing_files = []
    for file_path in files_to_convert:
        if os.path.exists(file_path):
            existing_files.append(file_path)
            print(f"✅ 找到文件: {file_path}")
        else:
            print(f"⚠️  文件不存在: {file_path}")
    
    if not existing_files:
        print("❌ 没有找到任何要转换的文件")
        return
    
    print(f"\n📋 准备转换 {len(existing_files)} 个文件")
    
    # 创建输出目录
    output_dir = "data/converted"
    os.makedirs(output_dir, exist_ok=True)
    
    # 批量转换文件
    print(f"\n🔄 开始批量转换...")
    converted_files = batch_convert_csv_files(
        file_list=existing_files,
        output_dir=output_dir,
        encoding='utf-8-sig'  # 使用UTF-8-BOM编码，Excel可以正确识别
    )
    
    print(f"\n✅ 转换完成！共转换了 {len(converted_files)} 个文件")
    
    # 显示转换结果
    print("\n📁 转换后的文件:")
    for i, file_path in enumerate(converted_files, 1):
        file_size = os.path.getsize(file_path) / 1024  # KB
        print(f"{i}. {file_path} ({file_size:.1f} KB)")
    
    # 显示文件预览
    if converted_files:
        print(f"\n👀 预览转换后的文件:")
        for file_path in converted_files:
            show_csv_preview(file_path, rows=3)
    
    print(f"\n💡 使用提示:")
    print(f"1. 转换后的文件保存在: {output_dir}/")
    print(f"2. 使用UTF-8-BOM编码，可在Excel中正确显示中文")
    print(f"3. 也可以使用文本编辑器（如VSCode、Notepad++）打开查看")
    print(f"4. 如果在Excel中仍有问题，可以尝试'数据' -> '从文本导入'功能")

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n⚠️  用户中断操作")
    except Exception as e:
        print(f"\n❌ 程序执行出错: {str(e)}")
        sys.exit(1) 